//
//  main.m
//  03-集合
//
//  Created by dllo on 16/7/6.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
   
    // 1.数组
    // 数组: 可变数组 NSMutableArray 与 不可变数组 NSArrray
    // 数组主要有序的存放元素的集合类型,并且可以通过下表取值.
    // 注意: 数组中只能存放对象类型
    // 不可变数组 只能取值
    // 可变数组 可以进行增 删 改的操作
    //不可变数组
    // 2. 初始化数组
    // <1> 初始化方法 initWithObjects 后面填入的参数一定是对象类型
    // 可变参数 C语言中的链表
    // 顺序填入需要的数组
    // 初始化结束以nil为判断标准
    NSArray *array = [[NSArray alloc] initWithObjects:@"shanghai", @"dalian", @"beijing", nil];
    NSArray *array1 = [[NSArray alloc] initWithObjects:@"123", @"234", @"345", @"456", nil];
    // <2> 构造器方法
    NSArray *array2 = [NSArray arrayWithObjects:@"123", @"234", @"345", @"456", nil];
    // <3> 字面量 同 NNString @"" NSNUmber @()
    // NSArray @[]
    // 三种初始化方式,推荐使用字面量的形式.
    // 字面量可以识别对象是否为空值;但一般的初始化方法不可以.
    // 如果为空,程序会崩溃
    // 但是, 初始化方法会识别nil为结束,并不会产生问题,造成数据的丢失.
    NSObject *obj = nil;
    NSArray *myArray = @[@"123", @"234", @"345", @"456"];
    // 3.取值相关
    // <1> count 取元素中的个数
    // <2>
    NSString *numberString = [array2 objectAtIndex:0];
    id object1 = [array1 objectAtIndex:0];
    // <3> 语法糖 取值方式 快捷取值
    NSString *stringOfNumberOfzero = array2[0];
    // <4> 根据值取对应的下标
    NSUInteger indexOfObject = [array indexOfObject:@"dalian"];
    NSLog(@"%ld", indexOfObject);
    // <5> 判断对象是否存在于数组中
    BOOL isHaveObject = [array containsObject:@"sahnghai"];
    NSLog(@"%@", isHaveObject ? @"YES" : @"NO");
    // <6> 取数组中第一个元素(第0位元素) 取数组中最后一个元素(如果数组为空,返回的对象为空,并且不会崩溃)
    [array firstObject];
    [array lastObject];
    //4. 不可变数组,改变元素(会生成新的数组,不会在原数组基础上修改)
    // <1> 数组添加一个新的元素
    array = [array arrayByAddingObject:@"tianjing"];
    // <2> 数组添加另外一个数组中的所有元素
    array = [array arrayByAddingObjectsFromArray:array1];
    // 可变数组 NSMutableArray
    // 1.初始化方法 同 不可变数组
    // 遇到可变数组, 只能使用初始化方法或者便利构造器
    // 字面量创建方法, 不推荐使用
    NSMutableArray *mutableArray = [@[@"shaghai", @"tianjing"] mutableCopy];
    NSMutableArray *mutableArray1 = [NSMutableArray array];
    // 2.取值方式 与 不可变数组方法 一样
    // 3.可变数组改变元素
    // <1> 数组中添加元素 addObject
    [mutableArray1 addObject:@"shenyang"];
    // <2> 插入数组中元素
    [mutableArray insertObject:@"haerbin" atIndex:1];
    // <3> 移除 数组中元素
    [mutableArray removeObjectAtIndex:0];
    [mutableArray removeLastObject];
    [mutableArray removeObject:@"shanghai"];
    // <4> 替换数组中元素 (空数组不能使用替换的方式)
    [mutableArray replaceObjectAtIndex:0 withObject:@"xinjiang"];
    NSLog(@"mutableArray = %@", mutableArray);
    // 可变 与 不可变的区别
    // 1.可变是可以修改的,但不可变不可以
    // 2.不可变调用改变的方法时,会生成对象; 可变调用改变方法时,在对象本身上进行修改
    // 3.可变 继承于 不可变
    // 字符串转换成数组
    // 将字符串根据某个子串,截取成数组.
    // 根据哪个子串截取,哪个子串就会消失
    NSString *wedAdress = @"www.baidu.com";
    NSArray *arrOfUrl = [wedAdress componentsSeparatedByString:@"."];
    NSLog(@"arrOFUrl = %@", arrOfUrl);
    // 数组转变成字符串
    // 根据某个字符串,把数组拼接成一个字符串
    NSArray *arrOfCity = @[@"chengdu", @"guangzhong", @"jilin"];
    NSString *strOfName = [arrOfCity componentsJoinedByString:@"#"];
    NSLog(@"cityname:%@", strOfName);
    return 0;
}
